﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using Sistema_Totem.Logica.Clases;
using Sistema_Totem.Logica.Excepciones;

namespace Sistema_Totem.Datos.SqlServer
{
    public class SqlServerUsuario
    {
        #region Agregar Usuario

        public int AgregarUsuario(Usuario usuario)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[insertarUsuario]"; // nombre del StoreProcedure "insertarUsuario"
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server.

                command.Parameters.AddWithValue("@idRol", usuario.Rol.Id);
                command.Parameters.AddWithValue("@nick", usuario.Nickname);
                command.Parameters.AddWithValue("@nombre", usuario.Nombre);
                command.Parameters.AddWithValue("@correo", usuario.Correo);
                command.Parameters.AddWithValue("@password", usuario.Clave);
                command.Parameters.AddWithValue("@telefono", usuario.Telefono);
                command.Parameters.AddWithValue("@idInsertado", SqlDbType.Int);

                command.Parameters["@idRol"].Direction = ParameterDirection.Input;
                command.Parameters["@nick"].Direction = ParameterDirection.Input;
                command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@correo"].Direction = ParameterDirection.Input;
                command.Parameters["@password"].Direction = ParameterDirection.Input;        
                command.Parameters["@telefono"].Direction = ParameterDirection.Input;        
                command.Parameters["@idInsertado"].Direction = ParameterDirection.Output;
                

                //se ejecuta el comando
                command.ExecuteReader();
                //se lee la variable de tipo output para saber que id fue insertado en base de datos.
                int idInsertado = Convert.ToInt32(command.Parameters["@idInsertado"].Value);
                // hacemos el return del ID del cliente para verficar que efectivamente se inserto el cliente
                return idInsertado;
            }
            catch (SqlException error)
            {
                throw (new UsuarioExcepcion("Error en la conexion: " + error));   
            }
            catch (NullReferenceException error)
            {
                throw (new UsuarioExcepcion("Los valores que devuelven la consulta son null", error));
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }
        }
        #endregion Agregar Usuario

        #region Consultar Usuario

        public List<Usuario> ConsultarUsuarios()
        {
            List<Usuario> listaInvolucrado = new List<Usuario>();

            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            try
            {
                miConexion.AbrirConexionBd();
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.Text;
                command.CommandText = "[dbo].[consultarTodosUsuario]"; //Nombre del StoreProcedure "consultarTodosUsuario"
                command.CommandTimeout = 10;

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Usuario usuario = new Usuario();

                    usuario.Id = Convert.ToInt32(reader[0]);
                    usuario.Nickname = reader[1].ToString();
                    usuario.Nombre = reader[2].ToString();
                    usuario.Clave = reader[3].ToString();
                    usuario.Telefono = reader[4].ToString();
                    usuario.Correo = reader[5].ToString();
                    usuario.Rol.Nombre = reader[6].ToString();

                    listaInvolucrado.Add(usuario);
                }
                reader.Close();
            }
            catch (SqlException e)
            {
                throw new Exception("Error en la conexion");
            }
            catch (Exception e)
            {
                throw new Exception("Error en la Base de Datos", e);
            }
           /* catch (NullReferenceException e)
            {
                throw new Exception("Los valores que devuelven la consulta son null");
            }*/
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }

            // Validamos que efectivamente la consulta devuelve aunque sea el nombre distinto a "NULL"
            if (listaInvolucrado == null)
            {
                return null;
            }
            else // Sino retornamos la lista del tipo Involucrados
                return listaInvolucrado;
        }
        #endregion Consultar Usuario

        #region Modificar Usuario

        public int ModificarUsuario(Usuario usuario)
        {
            //se instancia un objeto de tipo conexion y sqlCommand
            //estos se utilizan para acceder a base de datos y ejecutar el stored procedure en sql server
            Conexion miConexion = new Conexion();
            SqlCommand command = new SqlCommand();
            int idInsertado = 1;
            try
            {
                miConexion.AbrirConexionBd(); //se abre una conexion a base de datos

                // se completa la informacion de la conexion , variables, y nombre del stored procedure.
                command.Connection = miConexion.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure;
                command.CommandText = "[dbo].[modificarUsuario]"; // nombre del StoreProcedure "modificarUsuario"
                command.CommandTimeout = 10;

                //variables del stored procedure de sql server. @idUsuario

                command.Parameters.AddWithValue("@idUsuario", usuario.Id);
                command.Parameters.AddWithValue("@idRol", usuario.Rol.Id);
                command.Parameters.AddWithValue("@nick", usuario.Nickname);
                command.Parameters.AddWithValue("@nombre", usuario.Nombre);
                command.Parameters.AddWithValue("@correo", usuario.Correo);
                command.Parameters.AddWithValue("@password", usuario.Clave);
                command.Parameters.AddWithValue("@telefono", usuario.Telefono);

                command.Parameters["@idUsuario"].Direction = ParameterDirection.Input;
                command.Parameters["@idRol"].Direction = ParameterDirection.Input;
                command.Parameters["@nick"].Direction = ParameterDirection.Input;
                command.Parameters["@nombre"].Direction = ParameterDirection.Input;
                command.Parameters["@correo"].Direction = ParameterDirection.Input;
                command.Parameters["@password"].Direction = ParameterDirection.Input;
                command.Parameters["@telefono"].Direction = ParameterDirection.Input;


                //se ejecuta el comando
                command.ExecuteReader();
      
                
            }
            catch (SqlException error)
            {
                throw (new UsuarioExcepcion("Error en la conexion: " + error));
            }
            catch (NullReferenceException error)
            {
                throw (new UsuarioExcepcion("Los valores que devuelven la consulta son null", error));
            }
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            //se cierra la conexion independientemente de que se haya detectado o no una excepcion.
            finally
            {
                miConexion.CerrarConexionBd();
            }

            return idInsertado;
        }
        #endregion Modificar Usuario


    }
}